home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / EMULATOR / CPCEMU / !CPCEmu / DISKs / MY_PD.DSK / asskurs.txt next >
Text File  |  1996-09-12  |  33KB  |  819 lines

  1. Assemblerkurs Teil 1
  2.  
  3. Hi! Ich hei~e Face Hugger und habe mich von GWM breitschlagen lassen ⇩in der CPI einen Assemblerkurs aufzuziehen. Da ich momentan bei der BW ⇩bin und gerade nichts besseres zu tun habe, sitze ich hier auf meiner ⇩"Stube" und schreibe diesen Mist. Ich wei~ garnicht genau, wie ich ⇩euch den Senf beibringen soll, aber ich hoffe, da~ sich dieser Kurs ⇩positiv entwickelt. ]ber Kritik und Anregungen w}rde ich mich freuen. ⇩
  4. Als erstes stellt sich die Frage der Zielgruppe. Assemblerkenntnisse ⇩sind nicht notwendig. Ihr solltet euch allerdings etwas mit Bits und ⇩Bytes auskennen, Hexadezimalzahlen halbwegs beherrschen, vielleicht ⇩etwas }ber die Speicheraufteilung des CPC wissen und in Basic mehr ⇩zustandekriegen wie - 10 PRINT"Hallo ich heisse AOS!":GOTO 10 -
  5.  
  6.  
  7. Zum Assembler: Ich benutze den MAXAM-Assembler und werde mich in den ⇩Erkl{rungen auf diesen beschr{nken.
  8.  
  9. Auf geht's:
  10.  
  11.  
  12. Die Register
  13.  
  14. Die Register sind die Variablen der Maschinensprache. Ich beschr{nke ⇩mich ersteinmal auf die wichtigsten Register A, B, C, D, E, F, H, L. ⇩Diese Register sind alle 8-Bit gro~ (oder breit, tief, hoch...). A ist ⇩der sogenannte Akkumulator. Viele Assemblerbefehle (Operationen) ⇩lassen sich nur mit ihm ausf}hren. F}r 16-Bit-Operationen werden die ⇩Register B+C, D+E und H+L zu sogenannten Doppelregister oder auch ⇩Registerpaaren zusammengegfa~t. Sie lauten dann eben BC, DE und HL, ⇩wobei HL wieder eine besondere Stellung einnimmt, da einige Befehle ⇩nur mit HL m|glich sind
  15.  
  16.  
  17. Die ersten Befehle
  18.  
  19. Der CALL-Befehl: Diesen Befehl gibt es genauso in Basic. Er ruft ein ⇩Maschinenprogramm auf, {hnlich wie mann mit GOSUB in Basic ein ⇩Basic-Unterprogramm aufruft. Die Stelle im Speicher, wo das ⇩Maschinenprogramm anf{ngt wird als sogenannter Parameter hinter dem ⇩CALL angegeben. Diese "Stelle im Speicher" ist praktisch die ⇩Zeilennummer im Basic, nur da~ sie nicht Zeilennummer hei~t, sondern ⇩"Adresse" (hat nichts mit 'ner Wohnung zu tun). An der Adresse BB06 ⇩liegt ein Maschinenprogramm, da~ auf einen Tastendruck wartet. Mit dem ⇩CALL-Befehl k|nnen wir es aufrufen. Gebt in Basic ein:
  20.  
  21.   CALL &BB06
  22.  
  23. Der Rechner wartet auf einen Tastendruck, es funktioniert also.
  24.  
  25. Der RET-Befehl: Am Ende jedes Maschinenprogramms steht meistens ein ⇩RET-Befehl, der nichts anderes zu bedeuten hat, wie der RETURN-Befehl ⇩in Basic. Er zeigt das Ende eines Maschinen(unter-)programms an. Der ⇩Computer springt anschlie~end wieder zur}ck zum Hauptprogramm, wo der ⇩CALL-Befehl ausgef}hrt wurde.
  26.  
  27. Der LD-Befehl: Allgemein gesehen der meistgebrauchte Befehl; der ⇩Lade-Befehl. Der Syntax lautet LD <Ziel>,<Quelle>.
  28. LD A,B hei~t z.B. "Lade A mit B", in Basic w{re das "A=B". Dieser ⇩Befehl ist in vielf{ltiger Form auffindbar: LD D,E  LD L,A  LD C,L ⇩usw. . Man kann auch ein Register mit einem Wert (einer Konstanten) ⇩laden, z.B. LD B,10.
  29.  
  30.  
  31. Unser erstes Maschinenprogramm:
  32.  
  33. Maxam starten (Assembler & Editor), IM eingeben, <T>exteditor, <E>dit ⇩Text. Nun gebt folgendes Programm ein:
  34.  
  35.     ORG &5000    ;dies ist kein Assemblerbefehl, sondern ein ⇩            ;Hinweis, da~ der assemblierte Code bei der ⇩            ;Adresse &5000 anfangen soll.
  36.     LD A,2        ;A=2
  37.     CALL &BC0E    ;BC0E -> Mode-Befehl. Im Akku steht der ⇩            ;Bildschirmmode, hier Mode 2
  38.     RET        ;fertig
  39.  
  40. Wenn ihr dies eingetippt habt, ESC um ins Men} zur}ckzukommen und <A> ⇩f}r "Assemble" dr}cken, das Programm wird assembliert, Taste dr}cken ⇩um ins Men} zur}ckzukommen. Nun <J> dr}cken f}r "Jump to code". Unser ⇩Progr{mmchen steht bei &5000, also 5000 eingeben. Siehe da, Mode 2 is ⇩born!
  41.  
  42. Weiteres zum LD-Befehl: Ihr habt bisher erst zwei Varianten des ⇩Lade-Befehls kennengelernt, n{mlich LD Register,Register und ⇩LD’Register,Wert. Es gibt noch viele andere M|glichkeiten:
  43.  
  44. LD (Adresse),A   ;Lade A in die Speicherstelle "Adresse"
  45. LD A,(Adresse)   ;Lade A aus der Speicherstelle "Adresse"
  46.  
  47. genauso:
  48.  
  49. LD (HL),A
  50. LD A,(HL)
  51. LD (DE),A
  52. LD A,(DE)
  53. LD (BC),A
  54. LD A,(BC)
  55.  
  56. hier wird lediglich die Adresse an die/aus der der Akku geladen wird ⇩durch ein 16-Bit-Register angegeben.
  57.  
  58. Beispiel:
  59.  
  60.     ORG &5000
  61.  
  62.     LD A,255    ;A=255
  63.     LD (&C000),A    ;A nach C000 laden, bei C000 f{ngt der ⇩            ;Bildschirmspeicher an
  64.     RET        ;fertig
  65.  
  66. Wenn ihr das Ding mal startet, m}~te links oben auf dem Bildschirm ein ⇩kleiner l{nglicher Strich erscheinen. Der Wert 255 befindet sich nun ⇩an der Adresse C000.
  67.  
  68.  
  69. LD Doppelregister,16-Bit-Wert
  70.  
  71. Mit diesem Befehl k|nnen wir den Lade-Befehl LD (HL),A testen.
  72.  
  73.     ORG &5000
  74.  
  75.     LD A,255    ;A=255
  76.     LD HL,&C000    ;HL=C000 (nebenbei bemerkt: Die 8-Bit-Register ⇩            ;einzeln betrachtet ist H=C0 und L=00, H (bzw. ⇩            ;D oder B) ist das sog. Highbyte und L (bzw. E ⇩            ;oder C) das Lowbyte.
  77.     LD (HL),A    ;Lade A nach (HL), also an die Adresse aus HL, ⇩            ;also nach C000
  78.  
  79.     RET
  80.  
  81. Nun, wie zu Beginn erw{hnt, zu der besonderen Stellung des ⇩HL-Registers:
  82. Neben LD (HL),A ist genauso LD (HL),B; LD (HL),E; LD (HL),H m|glich. ⇩Bei DE und BC existiert der Befehl nur mit A, LD (BC),E ist z.B. nicht ⇩m|glich!!
  83. LD (Adresse),A ist auch nur mit dem Akku m|glich LD (Adresse),C gibt's ⇩nicht!
  84.  
  85. So das war's erstmal. Ist schon irgendjemand nicht mitgekommen? Im ⇩n{chsten Teil werde ich euch wieder ein paar neue Befehle erkl{ren und ⇩etwas }ber Flags erz{hlen. Au~erdem stelle ich euch mein erstes ⇩Assemblerprogramm vor (mehr wie 3 Jahre alt), von dem ich so ⇩hingerissen war, da~ ich mir in einer Woche den ganzen Assemblersumpf ⇩reingeschl}rft habe.
  86.  
  87.  
  88.  
  89.  
  90. Assemblerkurs Teil 2
  91.  
  92. Gebt mal in BASIC ein: MODE 2:FOR I=&C000 TO &C0FE:POKE i,255:NEXT
  93. Langsam aber sicher erscheinen ein paar Linien auf dem Screen. Wie das ⇩ganze in Assembler aussieht, zeige ich euch gleich, erstmal ein paar ⇩neue Befehle:
  94.  
  95.   INC register
  96. das Register wird um eins erh|ht (increment)
  97.  
  98.   DEC register
  99. das Register wird um eins verringert (decrement)
  100.  
  101. DEC A w{re z.B. A=A-1 in BASIC. Der Befehl ist genauso auf
  102. 16-Bit-Register anwendbar z.B. INC HL oder DEC BC.
  103.  
  104.   JP Adresse
  105. Springe {hnlich dem CALL-Befehl zur angegebenen Adresse. In BASIC ⇩vergleichbar mit dem GOTO-Befehl. Der Unterschied zum CALL-Befehl ⇩liegt darin, da~ hier nicht mit einem RET-Befehl zur}ckgesprungen ⇩werden kann.
  106.  
  107.   JR Sprungdifferenz
  108. JR ist im Prinzip genauso wie der JP-Befehl, nur da~ nun relativ zur ⇩aktuellen Adresse gesprungen wird. H|rt sich kompliziert an, ist aber ⇩recht einfach: JR 50 hei~t z.B. 'springe um 50 Bytes weiter'. Dies hat ⇩zwei Vorteile:
  109. 1. der Befehl ist um ein Byte k}rzer als der JP-Befehl.
  110. 2. Programme, die nur JPs statt JRs benutzen, laufen auch nur an der ⇩   Adresse, an der sie assembliert wurden. Programme, die nur JRs ⇩   benutzen sind an jeder beliebigen Adresse lauff{hig (andere ⇩   Befehle, die mit absoluten Adressen arbeiten d}rfen dann nat}rlich ⇩   auch nicht verwendet werden).
  111.  
  112. Nachteil: die Sprungdifferenz ist nur -128 bis +127 gro~.
  113. Um das Ausrechnen der Sprungdifferenz k}mmert sich nat}rlich der ⇩Assembler.
  114.  
  115.  
  116. Die Flags:
  117.  
  118. Die Flags sind einzelne Bits im bisher noch nicht besprochenen
  119. F-Register. Diese Bits werden durch einige Befehle beeinflu~t. Die ⇩beiden wichtigsten Flags sind das Carry-(]bertrags-)Flag und das
  120. Zero-Flag. Das Zero-Flag wird dann gesetzt, wenn z.B. beim
  121. INC/DEC-Befehl mit 8-Bit-Registern das entsprechende Register den Wert ⇩Null erreicht.
  122. Bei den Sprung befehlen (CALL, RET, JP, JR) lassen sich Bedingungen ⇩ankn}pfen, so da~ der Computer auf die Flagzust{nde reagieren kann, ⇩{hnlich wie IF THEN GOTO in BASIC.
  123. Die Bedingungen lauten Z (springe wenn Null (Zero)), NZ (springe wenn ⇩nicht Null (Not Zero)), C (springe bei ]bertrag (Carry)), NC (springe ⇩wenn kein ]bertrag (Not Carry)). Als Assemblersyntax sieht das so aus: ⇩CALL NZ,Adresse oder z.B. RET Z.
  124. Am besten versteht ihr das an einem zusammenh{ngendem Programm:
  125.  
  126. Mein erstes Assemberprogramm
  127.  
  128.     ORG &5000
  129.  
  130.     LD B,255    ;B ist der Schleifenz{hler, B=255
  131.     LD HL,&C000    ;HL enth{lt die Bildschirmadresse, HL=&C000
  132.     LD E,255    ;der Wert 255 soll in den Bildschirm gepoket ⇩            ;werden also E=255
  133. loop    LD (HL),E    ;E (255) in den Bildschirm keulen
  134.     INC HL        ;HL (Bildschirmadresse um eins erh|hen
  135.     DEC B        ;B=B-1 -> Zero-Flag wird gesetzt wenn B=0 ist
  136.     JR NZ,loop    ;Springe nach 'loop' wenn Zero-Flag nicht ⇩            ;gesetzt (B ungleich Null)
  137.     RET        ;fertig
  138.  
  139. Wenn ihr das mit dem Basicprogramm vergleicht, werdet ihr einen ⇩enormen Geschwindigkeitsunterschied feststellen. 'loop' ist ein sog. ⇩Label, eine Art Sprungmarke. Man kann solche Labels auch zu Beginn ⇩definieren. Unser MODE 2 Progr{mmchen aus dem 1.Teil dieses Kurses ⇩k|nnte z.B. so aussehen:
  140.  
  141. StMode    EQU &BC0E
  142.  
  143.     ORG &5000
  144.  
  145.     LD A,2
  146.     CALL StMode
  147.     RET
  148.  
  149. Nebenbei bemerkt: Bei diesen paar Assemblerzeilen w}rden die Profis ⇩schon aufschreien, da man das CALL und das nachfolgende RET zu einem ⇩JP zusammenfa~t:
  150.  
  151.     LD A,2
  152.     JP StMode
  153. macht n{mlich dasselbe und spart ein Byte, oder wie ein altes ⇩bayrisches Sprichwort sagt: CALL auf RET doas gibtes net!
  154. Genauso ist in BASIC die Befehlsfolge GOSUB 1000:RETURN v|lliger ⇩Quatsch, da hier ein GOTO 1000 hingeh|rt.
  155.  
  156. Als Schleifenz{hler kann theoretisch jedes andere der gebr{uchlichen ⇩8-Bit-Register benutzt werden. F}r solche Schleifen stellt der Z80 ⇩allerdings einen speziellen Befehl zur Verf}gung:
  157.   DJNZ Sprungdifferenz (bzw. in Assembler steht hier ein Label)
  158. Dieser Befehl tut nichts anderes wie die Befehlsfolge
  159.   DEC B
  160.   JR NZ,loop
  161. im Beispiellisting, ist aber ein Byte k}rzer und entsprechend ⇩schneller. Der DJNZ-Befehl benutzt das B-Register, deshalb wird dieses ⇩Register meistens als Schleifenz{hler benutzt. Zum Testen k|nnt ihr ⇩mal die besagten zwei Zeilen durch ein 'DJNZ loop' ersetzen.
  162.  
  163.  
  164. Nun mein erstes Progr{mmchen ist zwar sch|n, aber ziemlich sinnlos. ⇩Man sollte vielleicht mal den ganzen Screen f}llen:
  165.  
  166. Der Bildschirmspeicher ist &4000 gro~. Da ein 8-Bit-Register als ⇩Schleifenz{hler nicht ausreicht, m}ssen wir diesesmal mit einem ⇩Doppelregister arbeiten.
  167. Wir m}ssen also einfach den Befehl LD B,255 durch ein LD BC,&4000 und ⇩den Befehl DEC B durch DEC BC ersetzen. Doch da gibt es ein Problem: ⇩Wie bereits einmal angedeutet, beeinflu~t nur der INC/DEC-Befehl mit ⇩8-Bit-Registern das Zero-Flag. d.h. bei einem DEC BC w}rde der ⇩anschlie~ende Sprungbefehl JR NZ nicht korrekt funktionieren.
  168. Um zu testen ob ein 16-Bit-Register Null ist, bedienen wir uns dem ⇩OR-Befehl:
  169.  
  170. Syntax: OR 8-Bit-Register
  171.  
  172. Rein {u~erlich fand ich diesen Befehl fr}her als Assembler-Rookie ⇩ziemlich verwirrend, da er nur einen Parameter besitzt. Es ist aber ⇩ganz einfach: Solche Operationen werden immer mit dem Akku ausgef}hrt, ⇩und das Ergebnis wird immer im Akku gespeichert. Der Befehl OR ⇩bedeutet wie im BASIC eine Oder-Verkn}pfung
  173.  
  174.   OR B  hei~t z.B. A=A OR B. Der Akku wird mit dem B-Register ⇩ODER-Verkn}pft, und das Ergebnis wird im Akku gespeichert. F}r unser ⇩Beispiel wichtig: die Flags werden beeinflu~t.
  175. Um nun das 16-Bit-Register BC auf Nullheit abzutesten, sind folgende ⇩zwei Zeilen notwendig
  176.  
  177.     LD A,B        ;Lade A mit B
  178.     OR C        ;ODER-Verkn}pfung A mit C
  179.  
  180. Im Endeffekt ist dies eine ODER-Verkn}pfung zwischen B und C.
  181. B ODER C bedeutet: Ist in B ODER in C irgendein Bit gesetzt, dann sind ⇩auch im Ergebnis entsprechend Bits gesetzt.
  182.  
  183.     B: 01000010
  184.   ODER  C: 00011010
  185. ---------------------
  186.  Ergebnis: 01011010
  187.  
  188. Wie ihr seht, taucht nur dort ein Null-Bit auf, wo in B und C ein ⇩Null-Bit steht. Das Ergebnis ist also nur dann Null, wenn B und C ⇩gleich Null sind.
  189.  
  190. Alles zusammengefa~t sieht das Assemblerlisting zum Screenf}llen nun ⇩so aus:
  191.  
  192.     ORG &5000
  193.  
  194.     LD BC,&4000    ;BC ist der 16-Bit-Schleifenz{hler, BC=&4000
  195.     LD HL,&C000    ;HL ist die Bildschirmadresse, HL=&C000
  196.     LD E,255    ;E ist das F}llbyte, E=255
  197. loop    LD (HL),E    ;E in den Screen schmei~en
  198.     INC HL        ;Adresse auf dem Screen um eins erh|hen
  199.     DEC BC        ;Schleifenz{hler um eins verringern
  200.     LD A,B        ;Schleifenz{hler...
  201.     OR C        ;...ungleich Null?
  202.     JR NZ,loop    ;dann nach 'loop'
  203.     RET        ;fertig
  204.  
  205. Nebenbei bemerkt: den Schleifenz{hler k|nnte man sich in diesem Fall ⇩sparen, da der Bildschirmspeicher bei &0000 aufh|rt (&FFFF+1=&0000).
  206. Optimiert m}~te das Listing dann so aussehen:
  207.  
  208.     ORG &5000
  209.  
  210.     LD HL,&C000    ;HL=&C000
  211.     LD E,255    ;E=255
  212. loop    LD (HL),E    ;(HL)=E
  213.     INC HL        ;HL=HL+1
  214.     LD A,H
  215.     OR L        ;HL ungleich 0 ?
  216.     JR NZ,loop    ;dann nach 'loop'
  217.     RET        ;fertig
  218.  
  219. So das war's erstmal. Im n{chsten Teil werde ich euch wahrscheinlich ⇩etwas }ber Addition und Subtraktion erz{hlen und n{her auf die ⇩logischen Verkn}pfungen (like OR) eingehen. 
  220.  
  221.  
  222.  
  223.  
  224. Assemblerkurs Teil 3
  225.  
  226. Wie Versprochen nun etwas zu den Additions- und Subtraktionsbefehlen ⇩des Z80:
  227.  
  228. Auf 8-Bit-Ebene:
  229.  
  230.   ADD 8-Bit-Register
  231.  
  232. Das entsprechende 8-Bit-Register wird auf das Akku addiert. Das ⇩Ergebnis wird im Akku gespeichert. Die Flags werden beeinflu~t. ⇩]berschreitet das Ergebnis den 8-Bit-Bereich, so wird ein ]bertrag ⇩erzeugt (Carry=1).
  233.  
  234.   ADD H  ist z.B. A=A+H
  235.  
  236. genauso funktioniert auch die Addition mit einer Konstanten
  237.  
  238.   ADD 29  ist z.B. A=A+29
  239.  
  240. Will man B=B+11 rechnen, so mu~ man erst das B-Register ins Akku ⇩laden, 11 addieren und dann das Ergebnis wieder nach B zur}ckladen:
  241.  
  242.   LD A,B
  243.   ADD 11
  244.   LD B,A
  245.  
  246. Au~erdem gibt es noch den Befehl 'ADC 8-Bit-Register'. Er funktioniert ⇩genauso wie der ADD-Befehl, nur da~ hier zus{tzlich noch das Carry ⇩aufaddiert wird. Mit diesem Befehl l{~t sich eine 16-Bit-Addition ⇩realisieren:
  247.  
  248.  BC=BC+DE:
  249.  
  250.   LD A,C
  251.   ADD E     ;Lowbytes addieren
  252.   LD C,A
  253.   LD A,B
  254.   ADC D     ;Highbytes addieren unter Ber}cksichtigung des ]bertrags
  255.   LD B,A
  256.  
  257. Alle Befehle funktionieren genauso in der Subtraktion. Sie hei~en SUB ⇩bzw. SBC. Ein ]bertrag wird hier erzeugt, wenn das Ergebnis Null ⇩unterschreitet.
  258.  
  259.  
  260. Addition & Subtraktion mit 16-Bit:
  261.  
  262. Hierzu gibt es die Befehle:
  263.   ADD HL,HL    ;HL=HL+HL (HL*2)
  264.   ADD HL,DE    ;HL=HL+DE
  265.   ADD HL,BC    ;HL=HL+BC
  266.   ADD HL,SP    ;HL=HL+SP (SP= Stackpointer, kommt noch)
  267.   ADD IX,IX    ;IX=IX+IX (IX= Indexregister, kommt n{chstesmal)
  268.   ADD IX,DE    ;IX=IX+DE
  269.   ADD IX,BC    ;IX=IX+BC
  270.   ADD IX,SP     ;IX=IX+SP
  271.   ADD IY,IY     ;IY=IY+IY (IY= ebenfalls Indexregister)
  272.   ADD IY,DE     ;IY=IY+DE
  273.   ADD IY,BC     ;IY=IY+BC
  274.   ADD IY,SP     ;IY=IY+SP
  275.  
  276. Das sind alle 16-Bit-ADD-Befehle, sie existieren genauso als
  277. ADC-Befehle.
  278.  
  279. Subtraktion (hier gibt's kein SUB(!)):
  280.   SBC HL,HL    ;HL=HL-HL-Carry(!)
  281.   SBC HL,DE    ;HL=HL-DE-Carry(!)
  282.   SBC HL,BC    ;HL=HL-BC-Carry(!)
  283.   SBC HL,SP    ;HL=HL-SP-Carry(!)
  284.  
  285. Vorsicht: Da der Befehl SUB (ohne Carry) nicht existiert mu~ vor dem ⇩SBC-Befehl das Carry-Flag gel|scht werden, da sonst evtl. eins zuviel ⇩abgezogen wird. Hierzu benutzen wir den Befehl OR A (A=A OR A). Er ⇩ver{ndert den Akku nicht und l|scht das Carry-Flag. So f}hrt also nur ⇩die Befehlsfolge
  286.   OR A
  287.   SBC HL,DE
  288. zu einer Korrekten 16-Bit-Subtraktion HL=HL-DE.
  289.  
  290. Wie auch bei den 8-Bit-Additions- und Subtraktionsbefehlen wird auch ⇩bei 16-Bit bei }ber- bzw. unterschreiten des 16-Bit-Bereichs das ⇩Carry-Flag auf 1 gesetzt.
  291.  
  292.  
  293. Bin{re Logik: AND, OR, XOR
  294.  
  295. Diese Befehle existieren nur auf 8-Bit-Ebene. Die Operationen ⇩erfolgen, wie schonmal erw{hnt, immer mit dem Akku.
  296.  
  297. Allgemein: XOR 8-Bit-Register bzw. 8-Bit-Wert
  298.            hei~t A=A XOR 8-Bit-Register bzw. 8-Bit-Wert
  299. genauso OR und AND.
  300.  
  301.  
  302. Was hei~t eigentlich A=A OR/AND/XOR Register?
  303.  
  304.  
  305. Der AND-Befehl:
  306.  
  307. Beispiel:  A=10110001
  308.            B=10010010
  309.  
  310.   AND B   (A=A AND B):
  311.  
  312. Die Bits der beiden Register werden nun Ziffer f}r Ziffer verglichen ⇩und nach folgendem Schemna }bersetzt:
  313.  
  314. Bit x aus Register A   *   Bit x aus Register B   *   Ergebnis
  315. ******************************************************************
  316.           0            *             0            *      0
  317.           0            *             1            *      0
  318.           1            *             0            *      0
  319.           1            *             1            *      1
  320.                        *                          *
  321.  
  322. d.h. nur wenn in A und (and!) in B das jeweils verglichene Bit gesetzt ⇩ist (=1!), dann ist auch das jeweilige Bit im Ergebnis gesetzt.
  323.  
  324. Bit 7:   A: (1)0 1 1 0 0 0 1
  325.          B: (1)0 0 1 0 0 1 0
  326.  
  327. Ergebnis A:  1 x x x x x x x
  328.  
  329.  
  330. Bit 6:   A:  1(0)1 1 0 0 0 1
  331.          B:  1(0)0 1 0 0 1 0
  332.  
  333.          A:  1 0 x x x x x x
  334.  
  335.  
  336. Bit 5:   A:  1 0(1)1 0 0 0 1
  337.          B:  1 0(0)1 0 0 1 0
  338.  
  339.          A:  1 0 0 x x x x x
  340.  
  341. ...usw...
  342.  
  343.  
  344. Bit 0:   A:  1 0 1 1 0 0 0(1)
  345.          B:  1 0 0 1 0 0 1(0)
  346.  
  347.          A:  1 0 0 1 0 0 0 0
  348.  
  349. Wir sehen also: Nur wo in A und B eine '1' steht, steht auch im ⇩Ergebnis eine '1'.
  350.  
  351.  
  352. Der OR-Befehl:
  353.  
  354. Beim OR-Befehl werden die Bits nach folgenden Schema verglichen:
  355.  
  356.  Bit in A  *  Bit in B  *  Erg.
  357. ********************************
  358.      0     *      0     *   0
  359.      0     *      1     *   1
  360.      1     *      0     *   1
  361.      1     *      1     *   1
  362.  
  363. Nur wo in A oder (or!) in B das jeweilige Bit gesetzt ist, ist auch ⇩das Ergebnis-Bit gesetzt.
  364.  
  365.   OR B    (A=A OR B):
  366.  
  367.        A: 10110001
  368.     OR B: 10010010
  369.  ==================
  370.   Erg. A: 10110011
  371.  
  372.  
  373. Der XOR-Befehl (Exclusives Oder):
  374.  
  375. Schema:
  376.  
  377.  Bit in A  *  Bit in B  *  Erg.
  378. ********************************
  379.      0     *      0     *   0
  380.      0     *      1     *   1
  381.      1     *      0     *   1
  382.      1     *      1     *   0
  383.  
  384. Das entsprechende Bit im Ergebnis ist dann gesetzt, wenn die ⇩Bitzust{nde in A und B ungleich sind:
  385.  
  386.   XOR B
  387.  
  388.        A: 10110001
  389.    XOR B: 10010010
  390.  ==================
  391.   Erg. A: 00100011
  392.  
  393.  
  394. Nun fragt ihr euch, was man mit diesen Befehlen anfangen kann. Hier ⇩ein kurzer Anri~:
  395.  
  396. AND: l|schen von Bits (ausmaskieren) und abtesten von Bits
  397.  
  398. AND %11110000 l|scht z.B. die untere H{lfte (Low-Nibble) des Akkus. ⇩Das %-Zeichen ist in Maxam das Zeichen daf}r, da~ eine Bin{rzahl folgt ⇩(wie '&' bei Hexadezimalzahlen). In BASIC ist die '&X'.
  399. Da die oberen vier Bits (High-Nibble) }brig bleiben, k|nnte es auch in ⇩diesem Fall ein Test dieser Bits sein, da nat}rlich das Zero-Flag ⇩beeinflu~t wird (Carry wird immer gel|scht).
  400.  
  401.  
  402. OR: Setzen von Bits
  403.  
  404. OR %11000000 setzt z.B. die obersten beiden Bits des Akkus.
  405.  
  406.  
  407. XOR: Wird h{ufig bei Sprite-Routinen benutzt, die die ⇩Hintergrundgrafik nicht zerst|ren sollen.
  408.  
  409. Unser altes Beispiel:
  410.  
  411.         A: 10110001   (Byte aus der Hintergrundgrafik)
  412.         B: 10010010   (Byte aus Sprite (reimt sich!))
  413. (XOR B) A: 00100011   (Neues Bildschirmbyte)
  414.  
  415. ... Sprite ist gesetzt...
  416.  
  417.         A: 00100011   (Bildschirmbyte)
  418.         B: 10010010   (Byte aus Sprite (reimt sich immernoch!))
  419. (XOR B) A: 10110001   (Altes Byte aus der Hintergrundgrafik)
  420.  
  421. ... Sprite ist gel|scht...
  422.  
  423. Man braucht nur eine Routine zum Setzen, da ein weiteres setzen das ⇩Sprite wieder l|scht.
  424. Solche Sprites sehen nat}rlich ver{ndert aus wenn sie }ber eine Grafik ⇩huschen. Kennt ihr bestimmt aus einigen Games.
  425.  
  426. Puh! Das war's erstmal. N{chstesmal vielleicht was }ber ⇩Indexregister...
  427.  
  428.  
  429.  
  430.  
  431.  
  432. Assemblerkurs Teil 4
  433.  
  434.  
  435. Indexregister
  436.  
  437. Wie im letzten Teil kurz angesprochen, besitzt der Z80 weitere
  438. 16-Bit-Register, die sogenannten Indexregister, sie‘ hei~en IX und IY. ⇩Ich beschr{nke mich bei der Beschreibung erstmal auf IX, IY ist ⇩genauso.
  439.  
  440.   LD IX,16-Bit-Wert  funktioniert genauso wie  LD HL,16-Bit-Wert
  441.  
  442. Wir hatten gelernt, da~ man mit  'LD 8-Bit-Register,(HL)'  bzw.
  443. 'LD (HL),8-Bit-Register'  einen Wert in die Speicherstelle ⇩schreiben/lesen kann, die durch HL angegeben wird.
  444. Mit den Indexregistern funktioniert das genauso, nur da~ man noch ⇩einen Offset angeben kann. Der allgemeine Syntax lautet:
  445.  
  446.   LD 8-Bit-Register,(IX+Offset) bzw. LD (IX+Offset),8-Bit-Register
  447.  
  448. Beispiel:  LD IX,&A000
  449.            LD A,(IX+5)
  450.  
  451. Diese Befehlsfolge bezweckt, da~ der Akku mit dem Wert aus der ⇩Speicherstelle bei A005 geladen wird. Wozu ist das gut?
  452. Durch die Indexregister ist der Zugriff auf Tabellen wesentlich ⇩leichter. Beispiel:
  453. In einem Spiel f}r mehrere Personen werden alle Variablen (alles was ⇩die Spieler unterscheidet) in einer Tabelle gespeichert. Das k|nnen ⇩sein: Anzahl der Leben, Score, X- und Y-Positionen, Spritenummern, ⇩Timer oder auch Adressen von Unterroutinen, z.B. f}r die Tastatur- ⇩bzw. Joystickabfrage. Nun wird das ganze Spiel so geschrieben, da~ es ⇩}ber die Indexregister auf die Variablen zugreift. Der Spieler soll ⇩z.B. 100 Punkte bekommen:
  454.  
  455.   LD DE,100      ;DE=100
  456.   LD L,(IX+8)    ;Score nach HL
  457.   LD H,(IX+9)    ;...
  458.   ADD HL,DE      ;Score=Score+100
  459.   LD (IX+8),L    ;Score wieder speichern
  460.   LD (IX+9),H    ;...
  461.  
  462. Die Hauptschleife sieht dann so aus:
  463.  
  464. start:  LD IX,PlayerTabelle1
  465.     CALL Hauptroutine
  466.     LD IX,PlayerTabelle2
  467.     CALL Hauptroutine
  468.     CALL Frame
  469.     JP start
  470.  
  471. Eine kleine Erg{nzung zu den bisher gelernten Befehlen:
  472. Wenn ihr das Byte an der Speicherstelle, die durch HL angegeben wird ⇩um eins verringern wollt, so m}~t ihr nach dem bisher Gelernten ⇩folgendes Schreiben:
  473.   LD A,(HL)
  474.   DEC A
  475.   LD (HL),A
  476. dies k|nnt ihr euch sparen, denn ein DEC (HL) tut's auch (ganz ⇩unflexibel ist der Z80 ja nun doch nicht). Genauso funktioniert
  477. OR (HL), AND (HL), XOR (HL), ADD (HL), ADC (HL), SUB (HL), SBC (HL), ⇩INC (HL) und einige weitere Befehle, die ihr noch kennenlernt.
  478. Genauso funktioniert's mit den Indexregistern, also OR (IX+Offs),
  479. INC (IX+Offs) usw. . Mit BC und DE geht's nat}rlich nicht! DEC (BC) ⇩oder AND (DE) ist utopie! (wie war das noch mit der Flexibilit{t?!).
  480.  
  481.  
  482. Stackpointer, PUSH, POP:
  483.  
  484. Ein weiters Register, da~ ihr noch nicht kennt, ist der Stackpointer ⇩(SP-Register). Beim Z80 passiert es euch schnell, da~ euch die ⇩Register ausgehen. Wenn ihr ein Unterprogramm aufruft das eure ⇩belegten (Brote?) Register ver{ndert, so m}ssen diese irgendwo ⇩zwischengespeichert werden. Dies geht sehr schnell mit dem PUSH- und ⇩POP-Befehlen. Sie hei~en PUSH BC, PUSH DE, PUSH HL, PUSH IX, PUSH IY ⇩und PUSH AF bzw. POP BC, POP DE, usw. .
  485. Bei einem PUSH-Befehl wird das entsprechende 16-Bit-Register nach
  486. (SP-1) und (SP-2) gespeichert und das SP-Register um zwei verringert. ⇩Beim POP-Befehl geschieht dasselbe, blo~ umgekehrt. Die Daten werden ⇩von (SP) und (SP+1) in das entsprechende 16-Bit-Register geladen und ⇩der Stackpointer wird um zwei erh|ht. Wie der Name 'Stack' schon sagt, ⇩werden die Daten quasi gestapelt (Stackpointer=Stapelzeiger). Wenn die ⇩Daten mit dem POP-Befehl wiedergeholt werden sollen, so mu~ der Stapel ⇩in der umgekehrten Reihenfolge des PUSHens wieder abgebaut werden. ⇩Eine Unterroutine s{he dann so aus:
  487.  
  488. Unterroutine:    PUSH HL
  489.         PUSH DE
  490.         PUSH BC ;HL,DE und BC retten
  491.         ...
  492.         blablabla  ;Routine
  493.         ...
  494.         POP BC
  495.         POP DE
  496.         POP HL ;BC,DE und HL wiederholen
  497.         RET
  498.  
  499. Das Prinzip nennt man LIFO (Last In -> First Out, das letzte, was du ⇩auf den Stapel packst, kommt auch als erstes wieder runter).
  500. In dem ganzen Stapelzeigergewurschtel liegt auch eine schwerwiegende ⇩Absturzursache begraben. Wie ich euch schonmal erkl{rt habe, ruft ein ⇩CALL ein Unterprogramm auf und ein RET springt an die alte Adresse ⇩zur}ck, Irgendwo mu~ sich der Computer ja diese R}cksprungadresse ⇩merken. Und wo macht er das? Richtig! Auf dem Stack! Ein CALL f}hrt ⇩praktisch u.a. ein PUSH PC (PC? Program Counter, noch'n Register!) ⇩aus und ein RET ein POP PC. Wenn ich also in einer Unterroutine nicht ⇩genauso viele PUSHs wie POPs habe, kommt der CPC mit seiner ⇩R}cksprungadresse durcheinander und landet zu 99% im Nirvana (yeah!).
  501.  
  502.  
  503. Und wo ihr schonmal im Multi-Register-Lern-Modus seid, hier noch die ⇩letzten paar:
  504.  
  505. R-Register:
  506. Das ist das Refresh-Register, l{~t sich mit dem Akku lesen und ⇩schreiben, also nur LD A,R und LD R,A. Das Refresh-Register ist ⇩blablabla - RAM-Refresh. .... Es ist praktisch ein Z{hler und wird ⇩kontinuiertlich hochgez{hlt. Verwendung als Timer und f}r ⇩Zufallszahlen.
  507.  
  508. I-Register:
  509. Das ist das Interrupt-Register. Genauso wie beim R-Register l{~t sich ⇩mit LD A,I und LD I,A darauf zugreifen. Dieses Register hat im CPC ⇩keine besondere Verwendung und kann als Zwischenspeicher f}r den Akku ⇩benutzt werden.
  510.  
  511.  
  512. Etwas Allgemeines:
  513. Alle Ladebefehle beeinflussen die Flags nicht(!),
  514. au~er LD A,R und LD A,I !!!
  515.  
  516.  
  517. Im n{chsten Teil gibt's was }ber Bit-, Rotations- und Schiebe-Befehle.
  518.  
  519.  
  520.  
  521.  
  522.  
  523. Assemblerkurs Teil 5
  524.  
  525.  
  526. Jetzt wird's heftig! Im 5.Teil des Assemblerkurses gebe ich euch den ⇩Rest! Ich meine, ich erkl{re euch die restlichen Assemblerbefehle. ⇩Danach, im 6.Teil, gibt's eine Komplett}bersicht mit Kurzerkl{rung, ⇩inclusive Flagver{nderungen und Laufzeiten.
  527.  
  528. Auf geht's:
  529.  
  530. Die Rotationsbefehle:
  531.  
  532.   RL s        (s=A,B,C,D,E,H,L,(HL),(IX+Offs),(IY+Offs))
  533. Rotiert s nach links durch das Carry-Flag, d.h. der Inhalt des
  534. Carry-Flags wird Bit 0 (b0), Bit 0 wird Bit 1 (b1), b1 wird b2, ...
  535. b6 wird b7 und b7 kommt ins Carry.
  536. Beispiel:
  537.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  538.   B:    0   1   1   0   1   1   0   1      1
  539.  RL B
  540.   B:    1   1   0   1   1   0   1   1      0
  541.  
  542. Die Bits scrollen praktisch nach links durch das B-Register unter ⇩miteinbeziehen der Carry-Flags.
  543.  
  544.  
  545.    RR s
  546. Rotiert s nach rechts.
  547.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  548.   B:    0   1   1   0   1   1   0   1      1
  549.  RR B
  550.   B:    1   0   1   1   0   1   1   0      1
  551.  
  552.  
  553.    RLC s
  554. Rotiert nur s, links, ohne Carry, d.h. b0 wird nicht vom Carry ⇩bestimmt, sondern von b7. b7 wird zus{tzlich noch ins Carry geschoben.
  555.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  556.   B:    0   1   1   0   1   1   0   1      x
  557.  RLC B
  558.   B:    1   1   0   1   1   0   1   0      0
  559.  
  560.  
  561.    RRC s
  562. Rotiert s rechts, ohne Carry. Das Carry-Flag wird von b0 bestimmt.
  563.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  564.   B:    0   1   1   0   1   1   0   1      x
  565.  RRC B
  566.   B:    1   0   1   1   0   1   1   0      1
  567.  
  568.  
  569. Die gerade besprochenen Befehle existieren auch als Spezialbefehl f}r ⇩den Akku. Sie sind k}rzer und schneller. Die herk|mmlichen ⇩Befehle beeinflussen allerdings alle Flags, die speziellen Befehle mit ⇩dem Akku greifen nur auf das Carry-Flag zu.
  570. Die Akkubefehle lauten RLA, RRA, RLCA, RRCA. Es ist also ein ⇩Unterschied, ob ihr RLA schreibt oder RL A.
  571.  
  572.  
  573.    RLD
  574. rotiert Nibble-weise den Inhalt der Speicherzelle, die durch HL ⇩angegeben wird mit dem Low-Nibble des Akkus nach links.
  575.  
  576.            A            (HL)
  577.     xxxxaaaa      bbbbcccc
  578.   RLD
  579.     xxxxbbbb      ccccaaaa
  580.  
  581. Beispiel:  A            (HL)
  582.           &79           &F3
  583.   RLD
  584.           &7F           &39
  585.  
  586.  
  587.    RRD
  588. rotiert (HL) und A Nibble-weise rechts.
  589.  
  590.            A            (HL)
  591.     xxxxaaaa      bbbbcccc
  592.   RRD
  593.     xxxxcccc      aaaabbbb
  594.  
  595. Beispiel:  A            (HL)
  596.           &79           &F3
  597.   RRD
  598.           &73           &9F
  599.  
  600.  
  601. Schiebebefehle:
  602.  
  603. Hiervon gibt's nur drei:
  604.  
  605.    SLA s
  606. Schiebt die Bits von s nach links, Bit 7, welches durch die ⇩Schiebeaktion herausf{llt, wird vom Carry-Flag aufgefangen. Von rechts ⇩kommt eine Null herein.
  607.     Carry  b7  b6  b5  b4  b3  b2  b1  b0
  608.   B:      x    0   1   1   0   1   1   0   1
  609.  SLA B
  610.   B:      0    1   1   0   1   1   0   1   0
  611.  
  612.  
  613.    SRA s
  614. Schiebt die Bits von s nach rechts. Das Carry wird vom herausfallenden ⇩Bit 0 bestimmt. Es wird keine Null von links hereingeschoben(!), ⇩sondern b7 bleibt bestehen.
  615.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  616.   B:    0   1   1   0   1   1   0   1      x
  617.  SRA B
  618.   B:    0   0   1   1   0   1   1   0      1
  619.  
  620. Beispiel f}r b7=1:
  621.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  622.   B:    1   0   0   1   0   0   1   0      x
  623.  SRA B
  624.   B:    1   1   0   0   1   0   0   1      0
  625.  
  626.  
  627.    SRL s
  628. genauso wie SRA, nur wird b7 gleich Null, d.h. von links wird eine ⇩Null hereingeschoben.
  629.     b7  b6  b5  b4  b3  b2  b1  b0   Carry
  630.   B:    1   0   0   1   0   0   1   0      x
  631.  SRA B
  632.   B:    0   1   0   0   1   0   0   1      0
  633.  
  634.  
  635.  
  636. Bit-Befehle:
  637. Diese Befehle sind eigentlich recht einfach zu verstehen.
  638.  
  639.   SET Bitnr.,s
  640. Setzt Bit n in s
  641. Beispiel:    b7 b6 b5 b4 b3 b2 b1 b0
  642.       E: 1  1  0  1  0  0  0  0
  643.      SET 2,E
  644.           E: 1  1  0  1  0 (1) 0  0
  645.  
  646.   RES Bitnr.,s
  647. L|scht Bit n ind s
  648. Beispiel:    b7 b6 b5 b4 b3 b2 b1 b0
  649.       E: 1  1  0  1  0  0  0  0
  650.      RES 4,E
  651.           E: 1  1  0 (0) 0  0  0  0
  652.  
  653.   BIT Bitnr.,s
  654. Testet einen Bitzustand. Ist das getestete Bit gleich eins, so ist das ⇩Zero-Flag gel|scht (NZ), ist es gleich Null, so ist das Zero-Flag ⇩gesetzt (Z).
  655. Beispiel:    b7 b6 b5 b4 b3 b2 b1 b0
  656.       E: 0  1  1  0  0  1  0  0
  657.      BIT 4,E
  658.      JR Z,loop
  659. In diesem Fall w}rde der Computer nach 'loop' springen.
  660.  
  661.  
  662.  
  663. Sonstiges...
  664.  
  665.   CP s        (s=A,B,C,D,E,H,L,(HL),(IX+Offs),(IY+Offs),8-Bit-Zahl)
  666. Der CP-Befehl ist im Prinzip ein SUB-Befehl, nur da~ das Ergebnis ⇩nicht im Akku gespeichert wird. Er dient zum Vergleichen von zwei
  667. 8-Bit-Werten.
  668.  
  669.  CP B vergleicht z.B. den Akku mit B. Ist A kleiner als B (A<B), so ⇩ist das Carry-Flag gesetzt (C), da das Subtraktionsergebnis von A-B ⇩null unterschreitet. Ist A gr|~er oder gleich B (A>=B), so ist das ⇩Carry nicht gesetzt (NC). Ist A gleich B (A=B), dann ist das Zero-Flag ⇩gesetzt (Z), da in diesem Fall A-B=0 ist. Ist A ungleich B (A<>B), ⇩dann ist das Zero-Flag gel|scht (NZ).
  670.  
  671.  CP 8
  672.  JR C,mark   hie~e  springe wenn A<8
  673.  JR NC,mark  hie~e  springe wenn A>=8
  674.  JR Z,mark   hie~e  springe wenn A=8
  675.  JR NZ,mark  hie~e  springe wenn A<>8
  676.  
  677.  
  678.  
  679. Schaut euch folgendes Programm an:
  680.  
  681. loop     LD A,(HL)
  682.     LD (DE),A
  683.     INC HL
  684.     INC DE
  685.     DEC BC
  686.     LD A,B
  687.     OR C
  688.     JR NZ,loop
  689.  
  690. Dieses Programm ist eine Kopierschleife. Es kopiert von (HL) nach ⇩(DE). In BC steht die Anzahl der Bytes, die kopiert werden sollen.
  691. Daf}r gibt's einen Spezialbefehl:  LDIR
  692.   HL ist die Adresse der Quelldaten
  693.   DE ist die Zieladresse
  694.   BC ist die Anzahl der Bytes, die kopiert werden sollen
  695. Die Zeiger (HL und DE) werden dabei nach jedem kopierten Byte um eins ⇩erh|ht, der Code wird praktisch 'vorw{rts' kopiert.
  696.  
  697. loop     LD A,(HL)
  698.     LD (DE),A
  699.     DEC HL
  700.     DEC DE
  701.     DEC BC
  702.     LD A,B
  703.     OR C
  704.     JR NZ,loop
  705.  
  706. Ist dasselbe wie der Befehl LDDR. Dieser Befehl funktioniert genauso ⇩wie LDIR, nur werden die Bytes praktisch 'r}ckw{rts' kopiert, da die ⇩Pointer (HL und DE) jeweils verringert werden.
  707.  
  708. Beispiel:
  709.  
  710.     ORG &5000
  711.     LD HL,&8000 ;von &8000
  712.     LD DE,&C000 ;nach &C000
  713.     LD BC,&4000 ;&4000 Bytes
  714.     LDIR        ;kopieren
  715.     RET
  716.  
  717. kopiert euch den Bereich von &8000-&BFFF in den Bildschirmspeicher
  718. per LDIR.
  719.  
  720. Mit LDDR sieht das so aus:
  721.  
  722.     ORG &5000
  723.     LD HL,&BFFF ;Quelle &BFFF
  724.     LD DE,&FFFF ;Ziel &FFFF (Ende des Bildschirmspeichers)
  725.     LD BC,&4000 ;&4000 Bytes
  726.     LDDR        ;kopieren
  727.     RET
  728.  
  729.  
  730.  
  731.    SCF
  732. Setzt das Carry-Flag.
  733.  
  734.    CCF
  735. Komplementiert (invertiert) das Carry-Flag.
  736.  
  737.    CPL
  738. Invertiert den Akku.
  739. Beispiel:  A: 10110011
  740.           CPL
  741.            A: 01001100  
  742.  
  743.    NEG
  744. Negiert den Akku  A=0-A bzw. A=-A
  745. Wenn ihr z.B. B-A rechnen wollt, so m}~te man schreiben:
  746.   LD C,A
  747.   LD A,B
  748.   SUB C
  749. stattdessen kann man auch schreiben
  750.   SUB B  ;A-B
  751.   NEG    ;-(A-B)=B-A!
  752.  
  753.    DI
  754. sperrt den Interrupt.
  755.  
  756.    EI
  757. l{~t den Interrupt wieder zu.
  758.  
  759.    EX HL,DE (bzw. im Assemblerbuch steht EX DE,HL)
  760. vertauscht HL und DE.
  761.  
  762.    EX (SP),HL
  763.    EX (SP),IX
  764.    EX (SP),IY
  765. vertauscht HL,IX,IY mit dem obersten Stapelelement. Wozu ist das gut? ⇩Wenn man z.B. BC mit IX vertausche will, so geht das so:
  766.   PUSH BC
  767.   EX (SP),IX
  768.   POP BC
  769.  
  770.    EX AF,AF'
  771. Im Z80 existieren die Register A,F,B,C,D,E,H,L doppelt. Mit diesem ⇩Befehl wird der Akku samt Flags mit seinem Doppelg{nger vertauscht.
  772. Diesen, sowie den nachfolgenden Befehl solltet ihr nur benutzen, wenn ⇩ihr den CPC auch wirklich im Griff habt, da der zweite Registersatz ⇩vom Betriebsystem benutzt wird!
  773.  
  774.    EXX
  775. Vertauscht BC, DE und HL mit den Registern aus dem zweiten Satz.
  776.  
  777.    NOP (im Speicher ein Null-Byte)
  778. macht garnichts.
  779.  
  780.    HALT
  781. h{lt die CPU (den Z80) an. (H{?). Und zwar solange bis der n{chste ⇩Interrupt kommt.
  782.  
  783.    RST x      (x=&00,&08,&10,&18,&20,&28,&30,&38)
  784. Der RST-Befehl springt an die Adresse x. Dies ist ein schneller
  785. CALL-Befehl, da ein RST nur ein Byte lang ist (CALL = 3 Bytes, ⇩Befehlsbyte + zwei Bytes f}r die Adresse)
  786. Wird vom Betriebsystem benutzt.
  787.  
  788.    DAA
  789. Dezimalanpassung des Akkumulators, ziemlich ungebr{uchlicher Befehl.
  790. Beispiel:  A: &09
  791.     ADD 1
  792.     DAA
  793.        A: &10 (Normalerweise w{re A=&0A)
  794. Die Hexadezimalzahl sieht praktisch aus wie eine Dezimalzahl.
  795.  
  796.    IN r,(C)     (r=A,B,C,D,E,H,L)
  797. L{dt r von der Hardware, die durch die Adresse des BC(!) Registers ⇩angegeben wird, eigentlich m}~te der Befehl also IN r,(BC) hei~en!
  798. Beispiel:
  799.     LD B,&F5    ;Portadresse BC=&F5xx (Lowbyte ist nicht von
  800.                     ;Bedeutung)
  801. frame    IN A,(C)    ;Wert holen
  802.     RRA         ;b0 ins Carry rotieren
  803.     JR NC,frame ;Wiederholen bis Carry gesetzt ist
  804. Diese Routine wartet auf das sogenannte Frame-Signal, das alle 50stel ⇩Sekunde ausgegeben wird.
  805.  
  806.    IN A,(n)
  807. L{dt den Akku von der Hardware, die durch A (Highbyte) und den Wert n ⇩(Lowbyte) angegeben wird.
  808. Beispiel:
  809. frame    LD A,&F5
  810.         IN A,(0)
  811.     RRA
  812.     JR NC,frame
  813. s.o.
  814.  
  815.    OUT (c),r    (r=A,B,C,D,E,H,L)
  816. Gibt r an die Hardware aus, die durch die Adresse aus BC angegeben ⇩wird. Beispiel gibt's sp{ter mal.
  817.  
  818. Einige wenige Befehle fehlen noch. Diese werdet ihr aber in der ⇩versprochenen Gesamt}bersicht finden. Bis dann!
  819.